﻿using Catel.Articles._03___MVVM.Models;
using Catel.Articles.Base.Data.Attributes;
using Catel.Data;
using Catel.MVVM;

namespace Catel.Articles._03___MVVM.Examples.BasicViewModel
{
    /// <summary>
    /// BasicViewModel view model.
    /// </summary>
    [Example("Basic view model", "Shows how to create your first view model",
        LongDescription = "Shows the result of the usage of the vm (for the view model), vmpropmodel (for the model), " +
                          "vmpropviewmodeltomodel (view model to model mapping) and vmcommand (command) code snippets.",
        SourceFileName = "/Examples/BasicViewModel/PersonViewModel.cs")]
    public class PersonViewModel : ViewModelBase
    {
        #region Constructor & destructor
        /// <summary>
        /// Initializes a new instance of the <see cref="PersonViewModel"/> class.
        /// </summary>
        /// <param name="person">The person.</param>
        public PersonViewModel(Person person)
            : base()
        {
            // Store values
            Person = person;

            // Create commands
            CreateChildren = new Command<object>(CreateChildren_Execute);
        }
        #endregion

        #region Properties
        /// <summary>
        /// Gets the title of the view model.
        /// </summary>
        /// <value>The title.</value>
        public override string Title { get { return "View model title"; } }

        #region Models
        /// <summary>
        /// Gets or sets the person.
        /// </summary>
        [Model]
        public Person Person
        {
            get { return GetValue<Person>(PersonProperty); }
            private set { SetValue(PersonProperty, value); }
        }

        /// <summary>
        /// Register the Person property so it is known in the class.
        /// </summary>
        public static readonly PropertyData PersonProperty = RegisterProperty("Person", typeof(Person));
        #endregion

        #region View model
        /// <summary>
        /// Gets or sets the gender.
        /// </summary>
        [ViewModelToModel("Person")]
        public Gender Gender
        {
            get { return GetValue<Gender>(GenderProperty); }
            set { SetValue(GenderProperty, value); }
        }

        /// <summary>
        /// Register the Gender property so it is known in the class.
        /// </summary>
        public static readonly PropertyData GenderProperty = RegisterProperty("Gender", typeof(Gender));

        /// <summary>
        /// Gets or sets the first name.
        /// </summary>
        [ViewModelToModel("Person")]
        public string FirstName
        {
            get { return GetValue<string>(FirstNameProperty); }
            set { SetValue(FirstNameProperty, value); }
        }

        /// <summary>
        /// Register the FirstName property so it is known in the class.
        /// </summary>
        public static readonly PropertyData FirstNameProperty = RegisterProperty("FirstName", typeof(string));

        /// <summary>
        /// Gets or sets the middle name.
        /// </summary>
        [ViewModelToModel("Person")]
        public string MiddleName
        {
            get { return GetValue<string>(MiddleNameProperty); }
            set { SetValue(MiddleNameProperty, value); }
        }

        /// <summary>
        /// Register the MiddleName property so it is known in the class.
        /// </summary>
        public static readonly PropertyData MiddleNameProperty = RegisterProperty("MiddleName", typeof(string));

        /// <summary>
        /// Gets or sets the last name.
        /// </summary>
        [ViewModelToModel("Person")]
        public string LastName
        {
            get { return GetValue<string>(LastNameProperty); }
            set { SetValue(LastNameProperty, value); }
        }

        /// <summary>
        /// Register the LastName property so it is known in the class.
        /// </summary>
        public static readonly PropertyData LastNameProperty = RegisterProperty("LastName", typeof(string));
        #endregion
        #endregion

        #region Commands
        /// <summary>
        /// Gets the CreateChildren command.
        /// </summary>
        public Command<object> CreateChildren { get; private set; }

        /// <summary>
        /// Method to invoke when the CreateChildren command is executed.
        /// </summary>
        /// <param name="parameter">The parameter of the command.</param>
        private void CreateChildren_Execute(object parameter)
        {
            // TODO: Handle command logic here
        }
        #endregion

        #region Methods
        #endregion
    }
}
